package ambiente;

import robocode.CalculosRoboCode;
import robocode.DadosRobos.RoboScaneado;
import jason.asSyntax.Literal;

public class ControlePercepcoes {
	private final EnvSalvarRefem _esr;
	private boolean _addPercepcaoPertoInimigo = false;
	private boolean _addinimigopertorefem = false;
	private boolean _refemAreaSegura = false;
	private final int _nRobos;
	private CalculosRoboCode _cr;
	
	public ControlePercepcoes(EnvSalvarRefem esr, int numeroRobos, CalculosRoboCode cr){
		_cr = cr;
		_esr = esr;
		_nRobos = numeroRobos;
	}
	
	public void RealizarControlePercepcoes(){
		for (int i = 1; i <= _nRobos; i++) {
			pertorefem("sample.RoboFazNada ("+i+")");
			PercepcaoVolteiMinhaArea("sample.RoboFazNada ("+i+")");
			PercepcaocamposeguroRefem("sample.RoboFazNada ("+i+")");
			PercepcoesJason("sample.RoboFazNada ("+i+")");
		}
	}
	
	/*if (_refemSalvo){
		_esr.addPercept(
    			_imj.getAgQuatroAcoes(), 
    			Literal.parseLiteral("pertorefem"+indice+"."));
		
		_esr.removePercept(_imj.getAgQuatroAcoes(), Literal.parseLiteral("inimigopertorefem"+indice+"."));
    	//for�a o ataque
		_esr.addPercept(_imj.getAgQuatroAcoes(), Literal.parseLiteral("devoatacar"+indice+"."));
		
		return;
	}*/
	
	private void pertorefem(String nomeRobo){
		int index = _esr.getIndiceLista(nomeRobo);
		RoboScaneado rb = _esr.getRobo(index);
		RoboScaneado refem = _esr.getRoboRefemSalvar();
		int indice = _esr.getIndiceNomeRobo(nomeRobo);
		
		if (rb == null || refem == null) {return;}
		
//		if (_refemSalvo){
//			percepcaoPararSalvar(indice); return;
//		}
		
		if (RobosPertos(rb.getNomeRobo(), refem.getNomeRobo(), 150.0)){
			//_refemSalvo = true;
			//percepcaoPararSalvar(indice);
			
        	_esr.addPercept(
        			_esr.getAgQuatroAcoes(), 
        			Literal.parseLiteral("pertorefem"+indice+"."));
        	_esr.addPercept(
        			_esr.getAgRefem(), 
        			Literal.parseLiteral("refemseguir"+indice+"."));
        	
//        	System.out.println("##Percepcao Add: '" + "refemseguir"+indice+".'");
//        	System.out.println("###Est�o proximos ["+indice+"]");
        }
	}

	private void percepcaoPararSalvar(int indiceRoboSalvou){
		for (int i = 1; i <= _nRobos; i++) {
			if (i==indiceRoboSalvou) continue;
			
			_esr.addPercept(
        			_esr.getAgQuatroAcoes(), 
        			Literal.parseLiteral("pertorefem"+i+"."));
			
			_esr.addPercept(
        			_esr.getAgQuatroAcoes(), 
        			Literal.parseLiteral("voltei"+i+"."));
			
			//chama o m�todo de defesa
			_esr.addPercept(
        			_esr.getAgQuatroAcoes(), 
        			Literal.parseLiteral("inimigopertorefem"+i+".")); //defesa
		}
	}
	
	private void percepcaoRefemAtacar(){
		for (int i = 1; i <= _nRobos; i++) {
			_esr.addPercept(_esr.getAgRefem(),Literal.parseLiteral("camposeguro"+i+"."));
			_esr.removePercept(_esr.getAgRefem(),Literal.parseLiteral("refemseguir"+i+"."));
		}
		_esr.addPercept(_esr.getAgRefem(), Literal.parseLiteral("devoatacar5.")); //refem tb ira atacar
	}
	
	private void PercepcaoVolteiMinhaArea(String nomeRobo){
		int index = _esr.getIndiceLista(nomeRobo);
		RoboScaneado rb = _esr.getRobo(index);
		int indice = _esr.getIndiceNomeRobo(nomeRobo);
		
		if (rb == null) {return;}
		
		if (VolteiMinhaArea(rb.getNomeRobo())) {
			percepcaoPararSalvar(indice);
			percepcaoRefemAtacar();
			
//			_esr.removePercept(
//					_esr.getAgInimigo(), 
//					Literal.parseLiteral("agenteProximo."));
			_esr.addPercept(
					_esr.getAgQuatroAcoes(),
					Literal.parseLiteral("voltei" + indice + "."));
			
			_esr.addPercept(
					_esr.getAgQuatroAcoes(),
					Literal.parseLiteral("devoatacar" + indice + "."));

			for (int i = 1; i <= _nRobos; i++) {
    			_esr.removePercept(_esr.getAgRefem(),Literal.parseLiteral("refemseguir"+i+"."));
    			_esr.removePercept(_esr.getAgQuatroAcoes(),Literal.parseLiteral("pertorefem"+i+"."));
    		}
			
			_esr.removePercept(_esr.getAgRefem(),Literal.parseLiteral("refemseguir" + indice + "."));
			_esr.addPercept(_esr.getAgRefem(),Literal.parseLiteral("camposeguro" + indice + "."));
			_esr.addPercept(_esr.getAgRefem(),Literal.parseLiteral("devoatacar5."));
			
			//_refemAreaSegura = true;
		}
	}
	
	private void PercepcaocamposeguroRefem(String nomeRobo){
		RoboScaneado refemSalvar = _esr.getRoboRefemSalvar();
		int indice = _esr.getIndiceNomeRobo(nomeRobo);
		
		if (refemSalvar == null) {return;}
		
		if (camposeguroMeuRefem(refemSalvar.getNomeRobo())) {
			//_esr.removePercept(_esr.getAgInimigo(),Literal.parseLiteral("bloquear" + indice + "."));
			//_esr.addPercept(_esr.getAgInimigo(),Literal.parseLiteral("pararBloquear" + indice + "."));
			
			_esr.removePercept(_esr.getAgRefem(),Literal.parseLiteral("refemseguir" + indice + "."));
			_esr.addPercept(_esr.getAgRefem(),Literal.parseLiteral("camposeguro" + indice + "."));
			_esr.addPercept(_esr.getAgRefem(),Literal.parseLiteral("devoatacar5."));

			return;
		}
	}
	
	private void PercepcoesJason(String nomeRobo){
    	int index = _esr.getIndiceLista(nomeRobo);
    	RoboScaneado rb = _esr.getRobo(index);
    	
    	RoboScaneado rinimigo = _esr.getRoboInimigo(nomeRobo);
    	RoboScaneado refemSalvar = _esr.getRoboRefemSalvar();
    	//robo inimigo mais proximo do robo refem
    	RoboScaneado rinimigoRefem = _esr.getRoboInimigo(refemSalvar.getNomeRobo());
    	
    	if (rb == null || rinimigo == null || refemSalvar == null || rinimigoRefem == null) {
    		return;
    	}
    	//RobosPertos
    	
    	int indice = _esr.getIndiceNomeRobo(nomeRobo);
    	if (RobosPertos(rb.getNomeRobo(), rinimigo.getNomeRobo(), 300.0) 
    			&& !_addPercepcaoPertoInimigo) {
    		_addPercepcaoPertoInimigo = true;
    		//_esr.addPercept(_esr.getAgInimigo(), Literal.parseLiteral("bloquear"+indice+"."));
    		//_esr.addPercept(_imj.getAgSave(), Literal.parseLiteral("pertoInimigo."));
    		_esr.addPercept(_esr.getAgQuatroAcoes(), Literal.parseLiteral("pertoInimigo"+indice+"."));
    		//_esr.Continuar(null);
    	} //else if (!PertoInimigo(idRobo) && _addPercepcaoPertoInimigo) {
//    		_addPercepcaoPertoInimigo = false;
//    		//por enquanto n�o vou remover a percep��o aqui
//    		//if (!pertoInimigo()) _esr.removePercept(_imj.getAgSave(), Literal.parseLiteral("pertoInimigo."));
//    	}
    	
    	
    	if (RobosPertos(rinimigoRefem.getNomeRobo(), refemSalvar.getNomeRobo(), 300.0) 
    			&& !_addinimigopertorefem) {
    		_addinimigopertorefem = true;
    		
    		//_esr.addPercept(_imj.getAgQuatroAcoes(), Literal.parseLiteral("inimigopertorefem"+idRobo+"."));
    		//todos v�o proteger
    		_esr.addPercept(_esr.getAgQuatroAcoes(), Literal.parseLiteral("inimigopertorefem1."));
    		_esr.addPercept(_esr.getAgQuatroAcoes(), Literal.parseLiteral("inimigopertorefem2."));
    		_esr.addPercept(_esr.getAgQuatroAcoes(), Literal.parseLiteral("inimigopertorefem3."));
    		_esr.addPercept(_esr.getAgQuatroAcoes(), Literal.parseLiteral("inimigopertorefem4."));
    		
    	} //else if (!inimigopertorefem() && _addinimigopertorefem) {
//    		_addinimigopertorefem = false; 
//    	}

        if (RobosPertos(rb.getNomeRobo(), refemSalvar.getNomeRobo(), 300.0)
        		&& !_refemAreaSegura){
        	//adiciona a percep��o que chegou perto do refem, ent�o ele deve parar
        	//a caminhada em dire��o a ele
        	//addPercept(r1.getNomeRobo(), Literal.parseLiteral("pertorefem."));
        	/*if (!pi)*/
        	
        	
        	
        	for (int i = 1; i <= _nRobos; i++) {
    			_esr.removePercept(_esr.getAgRefem(),Literal.parseLiteral("refemseguir"+i+"."));
    			_esr.removePercept(_esr.getAgQuatroAcoes(),Literal.parseLiteral("pertorefem"+i+"."));
    		}
        	
        	//_esr.addPercept(_imj.getAgSave(), Literal.parseLiteral("pertorefem."));
        	_esr.addPercept(_esr.getAgQuatroAcoes(), Literal.parseLiteral("pertorefem"+indice+"."));
        	_esr.addPercept(_esr.getAgRefem(), Literal.parseLiteral("refemseguir"+indice+"."));
        	_esr.removePercept(_esr.getAgRefem(),Literal.parseLiteral("camposeguro"+indice+"."));
        	
        	//_esr.Continuar(null);
        	//aguarda um pouco, esperando que o Jason entenda a percep��o
        	//try { Thread.sleep(100); } catch (Exception e) {	e.printStackTrace(); }
        }
        
        //System.out.println("@@@@@@@@_refemSalvo: " + _refemSalvo);
        
//        if (_refemSalvo){ //taticas de ataque
//        	//System.out.println("!!!!!!!!!!taticas ataque 1");
//        	//add a percep��o de ataque
//        	if (!RobosPertos(rinimigo.getNomeRobo(), refemSalvar.getNomeRobo(), 300.0)) {
//        		//System.out.println("!!!!!!!!!!taticas ataque 2");
//        		//avisa aos robos
//        		_esr.addPercept(_esr.getAgQuatroAcoes(), Literal.parseLiteral("voltei1."));
//        		_esr.addPercept(_esr.getAgQuatroAcoes(), Literal.parseLiteral("voltei2."));
//        		_esr.addPercept(_esr.getAgQuatroAcoes(), Literal.parseLiteral("voltei3."));
//        		_esr.addPercept(_esr.getAgQuatroAcoes(), Literal.parseLiteral("voltei4."));
//        		
////        		_esr.addPercept(_imj.getAgRefem(),Literal.parseLiteral("camposeguro1."));
////    			_esr.removePercept(_imj.getAgRefem(),Literal.parseLiteral("refemseguir1."));
////    			_esr.addPercept(_imj.getAgRefem(),Literal.parseLiteral("camposeguro2."));
////    			_esr.removePercept(_imj.getAgRefem(),Literal.parseLiteral("refemseguir2."));
////    			_esr.addPercept(_imj.getAgRefem(),Literal.parseLiteral("camposeguro3."));
////    			_esr.removePercept(_imj.getAgRefem(),Literal.parseLiteral("refemseguir3."));
////    			_esr.addPercept(_imj.getAgRefem(),Literal.parseLiteral("camposeguro4."));
////    			_esr.removePercept(_imj.getAgRefem(),Literal.parseLiteral("refemseguir4."));
//        		
//        		_esr.addPercept(_esr.getAgQuatroAcoes(), Literal.parseLiteral("devoatacar1."));
//        		_esr.addPercept(_esr.getAgQuatroAcoes(), Literal.parseLiteral("devoatacar2."));
//        		_esr.addPercept(_esr.getAgQuatroAcoes(), Literal.parseLiteral("devoatacar3."));
//        		_esr.addPercept(_esr.getAgQuatroAcoes(), Literal.parseLiteral("devoatacar4."));
//        		//_esr.addPercept(_imj.getAgRefem(), Literal.parseLiteral("devoatacar5.")); //refem tb ira atacar
//        	}
//        }
    }
	
	//----------------------------------------------------------------
	private boolean RobosPertos(String nomeRobo1, String nomeRobo2, double distanciaMinima){
		_esr.atualizarDadosRobosViaTCP();
    	
    	RoboScaneado rb1 = _esr.getRobo(_esr.getIndiceLista(nomeRobo1));
    	RoboScaneado rb2 = _esr.getRobo(_esr.getIndiceLista(nomeRobo2));
    	if (rb1==null||rb2==null) return false;
    	double distancia = _cr.getDistanciaRobos(rb1, rb2);
    	
//    	String msg = "	" + rb1.getNomeRobo() + " ["+rb1.getX() + "," + rb1.getY() +"]\n";
//    	msg += "	" + rb2.getNomeRobo() + " ["+rb2.getX() + "," + rb2.getY() +"]\n";
//    	msg += "	" + "distancia: " + distancia;
//    	System.out.println(msg);
    	return distancia <= distanciaMinima;
    }
    
	private boolean VolteiMinhaArea(String nomeRobo){
		_esr.atualizarDadosRobosViaTCP();
		int index = _esr.getIndiceLista(nomeRobo);
		RoboScaneado rb = _esr.getRobo(index);
		if (rb == null) return false;
		
		return _cr.VolteiMinhaAreaPessoal(rb, _esr.getMLC(), _esr.getWCampo(), _esr.getHCampo());
//		int indice = _esr.getIndiceNomeRobo(nomeRobo);
//		
//		double xF = getXFinalRobo(indice), 
//			   yF = getYFinalRobo(indice);
//		//double distancia = CalculoVetores.distanciaPontos(rb.getX(), rb.getY(), xF, yF);
//		boolean ok = (rb.getX() >= xF-200 && rb.getY() <= yF-200); 
//		//System.out.println("[xF: " + xF + ", yF: " + yF + "] ok: " + ok);
//		return ok;
	}
    
	private boolean camposeguroMeuRefem(String nomeRefemSalvar) {
		_esr.atualizarDadosRobosViaTCP();
		RoboScaneado rb = _esr.getRoboRefemSalvar();
		if (rb == null) return false;
		return _cr.VolteiMinhaAreaPessoal(rb, _esr.getMLC(), _esr.getWCampo(), _esr.getHCampo());
	}
}